# _*_ coding: utf-8 _*_
# .@FileName:nodes_widget
# .@Data....:2025-01-29 : 00 : 38
# .@Aurhor..:LiuJingYu
"""
launch:
   import maya.cmds as cmds
   FileName.main() 
"""
# 从 __future__ 模块导入 unicode_literals 和 print_function 特性
# unicode_literals 使字符串字面量默认被当作 Unicode 字符串处理（主要用于 Python 2 兼容）
# print_function 引入 Python 3 风格的 print() 函数（主要用于 Python 2 兼容）
from __future__ import unicode_literals, print_function

# 导入自定义的配置模块，可能包含一些全局配置信息
import config
from typing import List, Tuple
# 从 PySide2.QtGui 模块导入所有内容，该模块包含了与图形用户界面相关的图形、字体、颜色等功能
from PySide2.QtGui import *
# 从 PySide2.QtCore 模块导入 Qt 类，该类包含了许多 Qt 框架的常量和枚举值
from PySide2.QtCore import Qt
# 从 PySide2.QtWidgets 模块导入所有内容，该模块包含了各种用户界面组件，如按钮、文本框等
from PySide2.QtWidgets import *

import maya.cmds as mc

import create_node_exp

import gen_name_exp_dialog

from PackUtils import undo_block

import regex_match_dialog

import setting
# 定义一个名为 CreateWidget 的类，继承自 QWidget，用于创建一个创建节点的界面
# class CreateWidget(QWidget):
#     def __init__(self, parent=None):
#         # 调用父类 QWidget 的构造函数，初始化该窗口部件
#         super(CreateWidget, self).__init__(parent)
#         # 创建一个垂直布局管理器，并将其设置为该窗口部件的主布局
#         self.main_Layout = QVBoxLayout(self)
#
#         # 创建一个水平布局管理器，用于放置创建界面的主体部分
#         self.body_layout = QHBoxLayout()
#
#         # 创建一个文本编辑框，用于输入节点名称
#         self.name_text = QTextEdit()
#         # 创建一个垂直布局管理器，用于放置创建表达式按钮
#         self.create_exp_bn_layout = QVBoxLayout()
#         # 创建一个按钮，按钮文本为“通过表达式创建”
#         self.create_exp_bn = QPushButton("通过表达式创建")
#         # 设置按钮的固定宽度为 120 像素
#         self.create_exp_bn.setFixedWidth(120)
#
#
#         self.create_exp_bn.clicked.connect(self.create_exp)
#
#
#         # 将创建表达式按钮添加到对应的垂直布局中
#         self.create_exp_bn_layout.addWidget(self.create_exp_bn)
#         # 在垂直布局中添加一个伸缩项，用于填充剩余空间
#         self.create_exp_bn_layout.addStretch(0)
#
#         # 将文本编辑框添加到主体水平布局中
#         self.body_layout.addWidget(self.name_text)
#         # 将创建表达式按钮的垂直布局添加到主体水平布局中
#         self.body_layout.addLayout(self.create_exp_bn_layout)
#
#         # 创建一个按钮，按钮文本为“创建”
#         self.create_bn = QPushButton("创建")
#         self.create_bn.clicked.connect(self.create_node)
#
#         # 创建一个标签，标签文本为“创建：  ”，并将其添加到主垂直布局中
#         self.main_Layout.addWidget(QLabel("创建：  "))
#         # 将主体水平布局添加到主垂直布局中
#         self.main_Layout.addLayout(self.body_layout)
#         # 将“创建”按钮添加到主垂直布局中
#         self.main_Layout.addWidget(self.create_bn)
#
#
#
#     def create_exp(self):
#         names = gen_name_exp_dialog.exec_()
#         self.name_text.setText("\n".join(("{}: {}".format(n, t) for n, t in names)))
#
#     def create_node(self):
#         exp = self.name_text.toPlainText()
#         for n, t in create_node_exp.Exp(exp):
#             mc.createNode(t, n=n)
#
#
#     def paintEvent(self, *args, **kwargs):
#         # 创建一个 QPainter 对象，用于在窗口部件上进行绘制操作
#         p = QPainter(self)
#         # 设置画笔为无，即不绘制边框
#         p.setPen(Qt.NoPen)
#         # 创建一个画刷，颜色为 RGB(65, 65, 65)，并将其设置为绘制的填充颜色
#         p.setBrush(QBrush(QColor(65, 65, 65)))
#         # 绘制一个与窗口部件大小相同的矩形
#         p.drawRect(self.rect())
#         # 结束绘制操作
#         p.end()
#
# # 定义一个名为 DeleteWidget 的类，继承自 QWidget，用于创建一个删除节点的界面
# class DeleteWidget(QWidget):
#     def __init__(self, parent=None):
#         # 调用父类 QWidget 的构造函数，初始化该窗口部件
#         super(DeleteWidget, self).__init__(parent)
#
#         # 创建一个垂直布局管理器，并将其设置为该窗口部件的主布局
#         self.main_Layout = QVBoxLayout(self)
#
#         # 创建一个水平布局管理器，用于放置删除界面的主体部分
#         self.body_layout = QHBoxLayout()
#
#         # 创建一个文本编辑框，用于输入要删除的节点名称
#         self.name_text = QTextEdit()
#
#         # 创建一个垂直布局管理器，用于放置匹配表达式按钮
#         self.match_exp_bn_layout = QVBoxLayout()
#         # 创建一个按钮，按钮文本为“通过正则表达式匹配”
#         self.match_exp_bn = QPushButton("通过正则表达式匹配")
#         # 设置按钮的固定宽度为 120 像素
#         self.match_exp_bn.setFixedWidth(120)
#
#         self.match_exp_bn.clicked.connect(self.regex_match)
#
#         # 将匹配表达式按钮添加到对应的垂直布局中
#         self.match_exp_bn_layout.addWidget(self.match_exp_bn)
#         # 在垂直布局中添加一个伸缩项，用于填充剩余空间
#         self.match_exp_bn_layout.addStretch(0)
#
#         # 将文本编辑框添加到主体水平布局中
#         self.body_layout.addWidget(self.name_text)
#         # 将匹配表达式按钮的垂直布局添加到主体水平布局中
#         self.body_layout.addLayout(self.match_exp_bn_layout)
#
#         # 创建一个按钮，按钮文本为“删除”
#         self.delete_bn = QPushButton("删除")
#         self.delete_bn.clicked.connect(self.delete_nodes)
#
#         # 创建一个标签，标签文本为“删除：  ”，并将其添加到主垂直布局中
#         self.main_Layout.addWidget(QLabel("删除：  "))
#
#         # 将主体水平布局添加到主垂直布局中
#         self.main_Layout.addLayout(self.body_layout)
#         # 将“删除”按钮添加到主垂直布局中
#         self.main_Layout.addWidget(self.delete_bn)
#
#     def regex_match(self):
#         self.name_text.setPlainText("\n".join(regex_match_dialog.exec_()))
#
#     def delete_nodes(self):
#         nodes = list(self.name_text.toPlainText().splitlines())
#         if len(nodes) < 1:
#             return
#         mc.delete(nodes)
#
#
#     def paintEvent(self, *args, **kwargs):
#         # 创建一个 QPainter 对象，用于在窗口部件上进行绘制操作
#         p = QPainter(self)
#         # 设置画笔为无，即不绘制边框
#         p.setPen(Qt.NoPen)
#         # 创建一个画刷，颜色为 RGB(65, 65, 65)，并将其设置为绘制的填充颜色
#         p.setBrush(QBrush(QColor(65, 65, 65)))
#         # 这里原代码有误，应该是 p.drawRect(self.rect())，绘制一个与窗口部件大小相同的矩形
#         p.drawRect(self.rect())
#         # 结束绘制操作
#         p.end()
#
# # 定义一个名为 NodesQWidgets 的类，继承自 QWidget，用于将创建和删除界面组合在一起
# class NodesQWidgets(QWidget):
#     def __init__(self, parent=None):
#         # 调用父类 QWidget 的构造函数，初始化该窗口部件
#         super(NodesQWidgets, self).__init__(parent)
#         # 创建一个垂直布局管理器，并将其设置为该窗口部件的主布局
#         self.main_layout = QVBoxLayout(self)
#         # 创建一个 CreateWidget 实例，并将其作为子窗口部件添加到当前窗口部件中
#         self.create_widget = CreateWidget(self)
#         # 创建一个 DeleteWidget 实例，并将其作为子窗口部件添加到当前窗口部件中
#         self.delete_widget = DeleteWidget(self)
#
#         # 将创建界面添加到主垂直布局中
#         self.main_layout.addWidget(self.create_widget)
#         # 将删除界面添加到主垂直布局中
#         self.main_layout.addWidget(self.delete_widget)

class BaseWidget(QWidget):
    """自定义控件基类（提供统一背景色）"""

    def paintEvent(self, event):
        """
        重绘事件处理函数
        :param event: 绘制事件对象
        """
        painter = QPainter(self)
        painter.setPen(Qt.NoPen)  # 禁用边框
        painter.setBrush(QBrush(QColor(65, 65, 65)))  # 设置深灰色背景
        painter.drawRect(self.rect())  # 绘制与控件等大的矩形
        painter.end()


class CreateWidget(BaseWidget):
    """节点创建控件（支持表达式批量创建）"""

    def __init__(self, parent=None):
        """
        初始化创建控件
        :param parent: 父级控件
        """
        super().__init__(parent)

        # 主布局配置
        self.main_layout = QVBoxLayout(self)
        self.main_layout.setContentsMargins(5, 5, 5, 5)  # 设置边距

        # 标题标签
        self.main_layout.addWidget(QLabel("创建节点："))

        # 内容区域布局
        self.body_layout = QHBoxLayout()

        # 节点名称输入框
        self.name_text = QTextEdit()
        self.name_text.setPlaceholderText("输入节点名称和类型（格式：名称:类型）")
        self.name_text.setMinimumHeight(80)

        # 按钮布局
        self.btn_layout = QVBoxLayout()
        self.btn_create_exp = QPushButton("表达式创建")
        self.btn_create_exp.setFixedWidth(120)
        self.btn_create_exp.clicked.connect(self._create_by_expression)

        # 组装界面元素
        self.btn_layout.addWidget(self.btn_create_exp)
        self.btn_layout.addStretch()
        self.body_layout.addWidget(self.name_text)
        self.body_layout.addLayout(self.btn_layout)

        # 创建按钮
        self.btn_create = QPushButton("执行创建")
        self.btn_create.clicked.connect(self._create_nodes)

        # 最终布局
        self.main_layout.addLayout(self.body_layout)
        self.main_layout.addWidget(self.btn_create)

    def _create_by_expression(self):
        """处理表达式创建按钮点击事件"""
        try:
            # 调用表达式对话框并直接获取结果
            names = gen_name_exp_dialog.exec_()  # 直接获取返回的names

            # 检查返回的有效结果（空列表视为取消操作）
            if names:

                    self.name_text.setText("\n".join(("{}: {}".format(n, t) for n, t in names)))
        except Exception as e:
            QMessageBox.critical(self, "错误", f"表达式生成失败: {str(e)}")


    def _create_nodes(self):
        """执行节点创建操作"""
        try:
            expressions = self.name_text.toPlainText().splitlines()
            if not expressions:
                QMessageBox.warning(self, "警告", "请输入有效的创建表达式")
                return

            # 执行Maya创建命令
            success_count = 0
            for line in expressions:
                if not line.strip():
                    continue
                try:
                    name, node_type = line.split(":", 1)
                    mc.createNode(node_type.strip(), n=name.strip())
                    success_count += 1
                except ValueError:
                    QMessageBox.warning(self, "格式错误", f"无效的表达式格式: {line}")
                except RuntimeError as e:
                    QMessageBox.critical(self, "创建错误", f"节点创建失败: {str(e)}")

            QMessageBox.information(
                self, "完成",
                f"成功创建 {success_count}/{len(expressions)} 个节点"
            )

        except Exception as e:
            QMessageBox.critical(self, "错误", f"发生未预期的错误: {str(e)}")


class DeleteWidget(BaseWidget):
    """节点删除控件（支持正则匹配）"""

    def __init__(self, parent=None):
        super().__init__(parent)

        # 主布局配置
        self.main_layout = QVBoxLayout(self)
        self.main_layout.setContentsMargins(5, 5, 5, 5)

        # 标题标签
        self.main_layout.addWidget(QLabel("删除节点："))

        # 内容区域布局
        self.body_layout = QHBoxLayout()

        # 节点名称输入框
        self.name_text = QTextEdit()
        self.name_text.setPlaceholderText("输入要删除的节点名称")
        self.name_text.setMinimumHeight(80)

        # 按钮布局
        self.btn_layout = QVBoxLayout()
        self.btn_regex_match = QPushButton("正则匹配")
        self.btn_regex_match.setFixedWidth(120)
        self.btn_regex_match.clicked.connect(self._match_by_regex)

        # 组装界面元素
        self.btn_layout.addWidget(self.btn_regex_match)
        self.btn_layout.addStretch()
        self.body_layout.addWidget(self.name_text)
        self.body_layout.addLayout(self.btn_layout)

        # 删除按钮
        self.btn_delete = QPushButton("执行删除")
        self.btn_delete.clicked.connect(self._delete_nodes)

        # 最终布局
        self.main_layout.addLayout(self.body_layout)
        self.main_layout.addWidget(self.btn_delete)

    def _match_by_regex(self):
        """处理正则匹配按钮点击事件"""
        try:
            self.name_text.setPlainText("\n".join(regex_match_dialog.exec_()))

        except Exception as e:
            QMessageBox.critical(self, "错误", f"正则匹配失败: {str(e)}")


    def _delete_nodes(self):
        """执行节点删除操作"""
        try:
            nodes = [
                n.strip()
                for n in self.name_text.toPlainText().splitlines()
                if n.strip()
            ]

            if not nodes:
                QMessageBox.warning(self, "警告", "请输入要删除的节点名称")
                return

            # 验证节点存在性
            invalid_nodes = [n for n in nodes if not mc.objExists(n)]
            if invalid_nodes:
                QMessageBox.warning(
                    self,
                    "无效节点",
                    f"以下节点不存在:\n{', '.join(invalid_nodes)}"
                )
                return

            # 执行删除操作
            mc.delete(nodes)
            QMessageBox.information(
                self, "完成",
                f"成功删除 {len(nodes)} 个节点"
            )

        except RuntimeError as e:
            QMessageBox.critical(self, "删除错误", f"节点删除失败: {str(e)}")
        except Exception as e:
            QMessageBox.critical(self, "错误", f"发生未预期的错误: {str(e)}")


class NodeManagerWidget(QWidget):
    """节点管理主控件（整合创建和删除功能）"""

    def __init__(self, parent=None):
        super().__init__(parent)

        # 主布局配置
        self.main_layout = QVBoxLayout(self)
        self.main_layout.setContentsMargins(0, 0, 0, 0)

        # 创建组件实例
        self.create_section = CreateWidget()
        self.delete_section = DeleteWidget()

        # 组装界面
        self.main_layout.addWidget(self.create_section)
        self.main_layout.addWidget(self.delete_section)


def create_node_manager() -> NodeManagerWidget:
    """
    创建节点管理控件
    :return: 配置好的节点管理控件实例
    """
    return NodeManagerWidget()


# 定义一个名为 new 的函数，用于创建并返回一个 NodesQWidgets 实例
def new():
    return NodeManagerWidget()















